<?php
/**
 * Created by PhpStorm.
 * User: wangjie
 * Date: 2018/11/6
 * Time: 14:40
 */

namespace common\services\tool;

use Yii;

/**
 * 字符串相关处理
 * Class ToolString
 * @package common\services\tool
 */
class ToolString
{
    /**
     * 数组转换成xml
     * @param $arr
     * @return string
     */
    public static function arrayToXml($arr) {
        $xml = "";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . self::arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }
        $xml .= "";
        return $xml;
    }

    /**
     * 判断字符串长度
     * @param $str
     * @return int
     */
    public static function mbStr($str)
    {
        return mb_strlen($str, 'utf8');
    }

    /**
     * 目标值是否数字（或数字组成的字符串）
     * @param $str
     * @return bool
     */
    public static function isInt($str)
    {
        return is_int($str) || (strval(intval($str)) === $str);
    }

    /**
     * 返回字符串的长度 中英文不区分
     * @param $str
     * @param string $charactset
     * @return int
     */
    public static function strLen($str, $charactset = 'utf-8')
    {
        if ($charactset != 'utf-8') {
            $tmp = @iconv($charactset, 'utf-8', $str);
            if (!empty($tmp)) {
                $str = $tmp;
            }
        }
        preg_match_all('/./us', $str, $match);
        return count($match[0]);  // 输出9
    }

    /**
     * @param $str
     * @param string $charactset
     * @return int
     */
    public static function strLenMb($str, $charactset = 'utf-8')
    {
        if ($charactset != 'utf-8') {
            $tmp = @iconv($charactset, 'utf-8', $str);
            if (!empty($tmp)) {
                $str = $tmp;
            }
        }
        return strlen($str);
    }

    /**
     * 判断字符串是否是邮件格式
     * @param string 文本
     * @return bool 是/否
     */
    public static function isEmail($p_str)
    {
        return (preg_match('/^[_\.0-9a-z-A-Z-]+@([0-9a-z-A-Z-][0-9a-z-A-Z-]+\.)+[a-z-A-Z-]{2,4}$/', $p_str)) ? true : false;
    }

    /**
     * 判断字符串是否是IP格式
     * @param string 文本
     * @return bool 是/否
     */
    public static function isIP($p_str)
    {
        return (preg_match('/^\d+\.\d+\.\d+\.\d+$/', $p_str)) ? true : false;
    }

    /**
     * 判断字符串是否是URL格式
     * @param string 文本
     * @return bool 是/否
     */
    public static function isURL($p_str)
    {
        return (preg_match('/^(https|http|ftp|rtsp|igmp|file|rtspt|rtspu):\/\/[\w-]*(\.[^\s]*)+/', strtolower($p_str))) ? true : false;
    }

    /**
     * 判断字符串是否是手机号码
     * @param string 文本
     * @return bool 是/否
     */
    public static function isTelephone($p_str)
    {
        return (preg_match('/^1[3-9]\d{9}$/', $p_str)) ? true : false;
    }

    /**
     * 判断银行卡是否正确
     * @param $cardNumber
     * @return string
     */
    public static function isBankCard($cardNumber)
    {
        $arr_no = str_split($cardNumber);
        $last_n = $arr_no[count($arr_no) - 1];
        krsort($arr_no);
        $i = 1;
        $total = 0;
        foreach ($arr_no as $n) {
            if ($i % 2 == 0) {
                $ix = $n * 2;
                if ($ix >= 10) {
                    $nx = 1 + ($ix % 10);
                    $total += $nx;
                } else {
                    $total += $ix;
                }
            } else {
                $total += $n;
            }
            $i++;
        }
        $total -= $last_n;
        $x = 10 - ($total % 10);
        if ($x == $last_n) {
            return true;
        }
        return false;
    }

    /**
     * 驼峰式字符串（首字母小写）
     * @param $str
     * @return mixed|string
     */
    public static function camelCase($str)
    {
        $str = preg_replace('/[^a-zA-Z0-9]/', ' ', $str);
        //使用空格隔开后，每个单词首字母大写
        $str = ucwords($str);
        //小写字符串的首字母，然后删除空格
        $str = lcfirst(str_replace(' ', '', $str));
        return $str;
    }

    /**
     * 驼峰式字符串（首字母大写）
     * @param $str
     * @return string
     */
    public static function camelCaseWithUcFirst($str)
    {
        return ucfirst(self::camelCase($str));
    }

    /**
     * 根据要求生成由数字组成的对应长度字符串
     * @param int $num 需要的随机排列字符串长度
     * @param int $type 需要的随机排列字符串的类型 0.数字 1.小写英文 2.大写英文 3.大小写英文 4.数字英文
     * @return string   返回相对应的字符串
     */
    public static function randomNum($num = 6, $type = 0)
    {
        $key = '';
        switch ($type) {
            case 0:
                $pattern = '0123456789';
                $len = 9;
                break;
            case 1:
                $pattern = 'abcdefghijklmnopqrstuvwxyz';
                $len = 25;
                break;
            case 2:
                $pattern = 'ABCDEFGHIJKLOMNOPQRSTUVWXYZ';
                $len = 25;
                break;
            case 3:
                $pattern = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
                $len = 50;
                break;
            case 4:
                $pattern = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
                $len = 60;
                break;
            case 5:
                $pattern = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ!@#$%^&*';
                $len = 68;
                break;
            default:
                return "其他";

        }
        for ($i = 0; $i < $num; $i++) {
            $key .= $pattern{mt_rand(0, $len)};    //生成php随机数
        }
        return $key;
    }
}


